Ordinary
About

테스트 더블

profileordilov / 2022. 1. 6

테스트 더블

테스트 더블이라는 단어는 xUnit의 저자 Gerard Meszaros 가 만든 단어입니다.
영화계에서 영화배우 대신 대역을 스턴트 더블이라고 하는데서 유래했습니다.
유래처럼 테스트 더블은 실제 객체 대신 테스트를 대신해주는 객체를 의미합니다.

테스트 더블이 필요할 때

  • 실제 객체를 사용하면 실제 서비스 환경에도 영향이 갈 때
  • 출력값이 잘 나오는지 확인할 수 없는 환경일 때
  • 외부 라이브러리를 쓰고 있고 잘못된 입력값의 예외처리를 잘하는지 확인하고 싶을 때
  • 테스트가 너무 느려서 빠르게 만들고 싶을 때

테스트 더블 종류

  • Dummy object
  • Test stub
  • Test spy
  • Mock object
  • Fake object

1. Dummy

실제 동작이 필요 없는 객체를 의미합니다. null 값으로 만들어도 상관없습니다.
테스트할려는 메서드에서 테스트할려는 기능은 아니지만 인자값을 넣어줘야할 때 쓰입니다.
즉 어떤 면에선 테스트 더블이라고 보기 힘든 객체입니다.
우리가 테스트하려는 객체를 대신하는 객체가 아니라 그 외의 객체를 대신합니다.

2. Test stub

테스트하려는 객체를 대신해 원하는 입력값을 반환하는 객체입니다.
즉 실제 구현과는 상관없이 원하는 값만을 반환합니다.
예를 들어 시간을 반환하는 상황에서 잘못 나오면 예외처리를 하는 상황을 테스트합니다.
문제는 우리가 만든 객체는 표준 라이브러리를 이용해 시간을 받아옵니다.
이 상황에서 잘못된 시간값을 받아오는 처리하는 것은 어렵습니다.
이럴 때 stub은 우리가 만든 객체를 대신해 잘못된 값을 넣어줘 예외처리를 테스트하게 합니다.
이처럼 실제 상황에서 원하는 입력값을 만들기 힘들 때 사용할 수 있습니다.

3. Test spy

Test stub에서 출력값을 확인할 수 있는 방법을 추가한 객체입니다.
콘솔에 출력하거나 로그로 찍으면 잘 출력됐는지 테스트하기 힘듭니다.
이런 출력을 검증은 못해도 약간의 기록을 남겨서 확인합니다.

4. Mock object

Test stub에서 출력값을 확인할 수 있고 검증까지 가능해야 합니다.
Test spy에서는 기록을 남기기는 했지만 검증을 하고 넘어갈 필요는 없습니다.
하지만 Mock object는 출력이 잘됐는지 검증이 가능해야 합니다.

5. Fake Object

Test stub처럼 원하는 입력값을 반환하는 객체입니다.
하지만 실제 구현과 상관 없는게 아닌 실제와 비슷하지만 더 단순하게 작성합니다.
예를 들면 데이터베이스 연결과 같은 외부 연결만 대신하는 식으로 작성합니다.
테스트가 느린 경우, 외부 환경이 준비 안된 경우 대신 사용할 수 있습니다.

종류를 구분해보면

조회를 위한 테스트 더블

  • Dummy
  • Fake
  • Stub

어떤 값을 입력하고 그에 대한 출력을 기대하는 객체들입니다. 즉 입력했을 때 반환되는 출력을 위해 사용하는 조회를 대신하는 객체들입니다.

명령을 위한 테스트 더블

  • Mock
  • Spy

반환되는 값보다 내부에서 수행하는 행위가 증요한 테스트 더블입니다. 행위에 해당하는 코드가 실제와 다르더라도 그 메서드가 호출되었는지가 중요한 객체들입니다.


책을 보다 보면 테스트 더블이라는 말을 많이 보게 됐습니다.
테스트를 위한 객체라는 것은 감이 왔지만 제대로 된 뜻을 모르고 있었습니다.
그래서 xUnit 을 기준으로 정리해봤습니다.
하지만 다른 단어들도 그렇듯 같은 말이지만 다르게 쓰이는 경우가 많은 것 같습니다.
그런 부분은 추후에 추가하겠습니다.